package AuthorityAgent;

import jade.content.ContentElement;
import jade.content.ContentManager;
import jade.core.Agent;
import jade.domain.DFService;
import jade.domain.FIPANames;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.FailureException;
import jade.domain.FIPAAgentManagement.NotUnderstoodException;
import jade.domain.FIPAAgentManagement.RefuseException;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.proto.SimpleAchieveREResponder;

import java.sql.Date;

import wwtp.ontology.RequestHelp;
import wwtp.ontology.Time;

public class HelpRequestHandlerBehaviour extends SimpleAchieveREResponder
{
	private ContentManager manager;

    public HelpRequestHandlerBehaviour(Agent a,MessageTemplate mt) {
        super(a,mt);
        manager = myAgent.getContentManager();
    }

    @Override
    protected ACLMessage prepareResponse(ACLMessage request) throws NotUnderstoodException, RefuseException {

    	ACLMessage response = request.createReply();
    	ContentElement ce;
		try {
			ce = manager.extractContent(request);
	    	Time t = ((RequestHelp)ce).getTimeLeft();
	    	ServiceDescription servicio = new ServiceDescription();
	        servicio.setType("WWTP");

	        DFAgentDescription descripcion = new DFAgentDescription();
	        descripcion.addServices(servicio);

	        DFAgentDescription[] resultados;

			resultados = DFService.search(myAgent, descripcion);

	        if (resultados.length <= 0) {
	            System.out.println("No existen WWTPs registradas en el sistema");
	        }

	        //Y les mandamos a todos menos el que habia mandado el requestHelp una peticion de contractNet
	        ACLMessage mensajeCFP = new ACLMessage(ACLMessage.CFP);

	        String origen, tankOrigen, destino;
	        origen = request.getSender().getLocalName();
	        tankOrigen = ((RequestHelp)ce).getTank().getName();
	        
	        boolean destinatarios = false;
	        for (DFAgentDescription agente:resultados) {
	        	destino = agente.getName().getLocalName();
            	if(origen.compareTo(destino) != 0)
            		if(((AuthorityAgent)myAgent).dbDirectWater.getTime(tankOrigen, destino) > 0){
            			//Si es posible mandar agua...
            			mensajeCFP.addReceiver(agente.getName());
            			destinatarios = true;
            		}
            			
            }
	        
	        if (destinatarios){
	        	mensajeCFP.setProtocol(FIPANames.InteractionProtocol.FIPA_CONTRACT_NET);
	 	        mensajeCFP.setLanguage(((AuthorityAgent) myAgent).codec.getName());
	 	        mensajeCFP.setOntology(((AuthorityAgent) myAgent).ontology.getName());

	 			manager.fillContent(mensajeCFP, ce);

	 	        //Indicamos el tiempo que esperaremos por las ofertas.
	 	        mensajeCFP.setReplyByDate(new Date(System.currentTimeMillis() + t.getSeconds()));
	 	        ((AuthorityAgent)myAgent).addBehaviour(new ContractNetBehaviour(this.myAgent, mensajeCFP, request));
	        }
	        else{
	        	ACLMessage inform = request.createReply();
	            inform.setPerformative(ACLMessage.INFORM);
	            inform.setConversationId("InformHelper");
	            inform.setContent(request.getSender().getLocalName());
	            myAgent.send(inform);
	        }
	       
		} catch (Exception e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}


		response.setPerformative(ACLMessage.AGREE);//Se necesita enviar INFORM
		return response;

    }

    protected ACLMessage prepareResultNotification(ACLMessage request,ACLMessage response) throws FailureException
    {
    	response.setPerformative(ACLMessage.INFORM);//Se necesita enviar INFORM
		return response;
    }
}
